package com.example.utils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 支持高并发、分布式部署的30位订单编号生成器
 */
public class OrderNGenerator {
    // 5位节点ID（每个Pod唯一）
    private final String nodeId;
    // 11位序列号，使用AtomicInteger保证线程安全
    private final AtomicInteger sequence = new AtomicInteger(0);
    // 日期格式化工具，用于生成时间戳部分
    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

    /**
     * 构造函数，初始化节点ID
     *
     * @param nodeId 节点ID，必须为5位字符串
     * @throws IllegalArgumentException 如果节点ID长度不是5位
     */
    public OrderNGenerator(String nodeId) {
        if (nodeId.length() != 5) {
            throw new IllegalArgumentException("节点ID必须为5位");
        }
        this.nodeId = nodeId;
    }

    public static void main(String[] args) {
        // 示例：通过环境变量获取 nodeId（K8s中可配置）
        String podInstanceId = System.getenv().getOrDefault("POD_INSTANCE_ID", "00000");
        // 创建OrderNGenerator实例
        OrderNGenerator generator = new OrderNGenerator(podInstanceId);

        // 生成并打印10个订单编号
        for (int i = 0; i < 10; i++) {
            System.out.println(generator.generate());
        }
    }

    /**
     * 生成30位订单编号
     *
     * @return 生成的订单编号字符串
     */
    public synchronized String generate() {
        // 获取当前时间戳，精确到秒
        String timestamp = sdf.format(new Date());
        // 生成11位序列号，使用自增策略并前补零
        long seq = (sequence.incrementAndGet() % 100000000000L + 10000000000L);
        // 拼接时间戳、节点ID和序列号，并去掉前导1
        return String.format("%s%s%s", timestamp, nodeId, seq).substring(1);
    }
}

